home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 2
/
Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso
/
Aminet
/
gfx
/
conv
/
Wasp202b.lha
/
wasp
/
src
/
wasp.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-03-21
|
9KB
|
414 lines
/* wasp - convert a picture from GIF, IFF, Sun rasterfile,
* PPM, Hamlab or SRGR to IFF, SRGR or PPM,
* optionally scaling it and performing various operations on it.
* Copyright 1991 by Steven Reiz, see the COPYING file for more info.
* 1/12/90 - 2/6/91, 23/6/91, 30/6/91, 3/7/91 - 8/7/91,
* 24/7/91, 22/10/91, 16/11/91, 8/12/91, 27/12/91 - 1/1/92, 21/3/92
* usage: see the usage routine below
*/
static char *sourcefile=__FILE__;
#define MAIN
#include "wasp.h"
static short zap_option=0;
static int testpatx=0, testpaty;
main(int argc, char **argv)
{
initvars();
do_options(argc, argv);
if (testpatx)
testpat(testpatx, testpaty);
else {
copen_in(infilename);
if (!read_srgr() && !read_iff() && !read_gif() && !read_ras()
&& !read_ppm() && !read_hl() && !read_mtv()) {
printe("%s is not in IFF, GIF87a, Sun rasterfile, PPM, Hamlab, MTV or SRGR format\n", infilename);
exit(1);
}
if (infd!=0)
close(infd);
}
assert(rgb);
copen_out(outfilename);
if (zap_option)
unlink(infilename);
scaley(yc, yd);
scalex(xa, xb);
do_operations(argc, argv);
switch (outputformat) {
case IFF:
write_iff();
break;
case SRGR:
write_srgr();
break;
case PPM:
write_ppm();
break;
default:
printe("unknown output format\n");
exit(1);
break;
}
if (outfd!=1)
close(outfd);
exit(0);
}
char *usagestr[]=
{
"usage: wasp [options] [operations] [parameters] infile|- [outfile|-]",
"options:",
"-zap : delete infile after it has been read",
"-gifmaptrunc: truncate gif colormap entries to 4 bits i.s.o. rounding them",
"-iff|srgr|ppm: the output format, IFF ILBM, SRGR or ppm",
"-rgb n : ilbm output mode, direct RGB with n bitplanes",
"-nocompr : ilbm output will not be compressed",
"-asc : autoscale, scales to fit the entire picture on the screen",
"-nohires : asc hint, no hires output mode for pictures with more than 16 colors",
"-nohires! : asc hint, no hires output mode",
"-scrw n : asc hint, screen width in lores pixels",
"-scrh n : asc hint, screen height in nolace pixels",
"-sliced|dyn|mp: multimap ilbm output, sliced=SHAM|dynamic=CTBL|multipalette=PCHG",
"-lace|nolace: ilbm output interlace, on or off",
"-hires|lores|ham|ehb: ilbm output mode",
"operations:",
"-testpat x y: create a test pattern of x columns and y rows",
"-x a/b : scale horizontal, producing a columns out of every b input columns",
"-y c/d : scale vertical, producing c rows out of every d input rows",
"-clip minx maxx miny maxy: cut a rectangle out of the picture and drop the rest",
"-enlarge x y: enlarge the picture to x columns and y rows",
"-xaverage : same as -x 1/2, but averaging the two input columns",
"-xmirror : mirror the picture in a vertical mirror",
"-ymirror : mirror the picture in a horizontal mirror",
"-transpose : mirror the picture diagonally, in mirror y=x",
"parameters:",
"-cmeth m : counting method, all1|alldif|allfdif|j1|j21|jdif|jdifsh|jfdif|jfdifsh|hmgs|hmcubic",
"-dmeth m : distribution method, mu|wf|ehb|mue|hs|con",
"-dmeth2 m : iterative ham second distribution method",
"-threshold n: counting threshold",
NULL
};
void
usage(void)
{
char **p;
printe("wasp %s, %s %s, Copyright 1991,1992 by Steven Reiz\n",
version+14, __DATE__, __TIME__);
for (p=usagestr; *p; ++p)
printe("%s\n", *p);
exit(1);
}
void
initvars(void)
{
rgb=NULL;
outputformat=IFF;
directrgb= -1;
compression=COMPR_RLE;
asc=0;
hires=HIRES_OK;
sliced=SLICED_NOT;
scrw=DEF_SCRW;
scrh=DEF_SCRH;
ymode=UNSET;
xmode=UNSET;
xa=1; xb=1; yc=1; yd=1;
countmeth=COUNTMETH_UNSET;
distrmeth=DISTRMETH_UNSET;
distrmeth2=DISTRMETH_UNSET;
curdistrmeth=DISTRMETH_UNSET;
threshold=1;
inoperation=0;
gifmaptrunc=0;
cread_type=CREAD_STRICT;
#ifdef AMIGA
get_scr_size();
#endif
}
void *
cmalloc(unsigned int n)
{
void *p;
if (!(p=malloc(n)))
error1(E0_FATAL, E1_NOMEM, E2_UNSPEC, E3_NOMEM, n);
return p;
}
void *
ccalloc(unsigned int n)
{
void *p;
if (!(p=calloc(n, 1)))
error1(E0_FATAL, E1_NOMEM, E2_UNSPEC, E3_NOMEM, n);
return p;
}
void *
crealloc(void *q, unsigned int n)
{
void *p;
if (!(p=realloc(q, n)))
error1(E0_FATAL, E1_NOMEM, E2_UNSPEC, E3_NOMEM, n);
return p;
}
void
lowcase(char *s)
{
char c;
while (c= *s) {
if (c>='A' && c<='Z')
*s=c-'A'+'a';
++s;
}
}
unsigned long
ceillog2(unsigned long a)
{
u_long b;
short i;
assert(a);
b=a;
for (i= -1; b; ++i)
b>>=1;
b=1L<<i;
return (u_long)(a>b ? i+1 : i);
}
static char *sc[]={
#define S_IFF 0
"iff",
#define S_SRGR 1
"srgr",
#define S_RGB 2
"rgb",
#define S_NOCOMPR 3
"nocompr",
#define S_ASC 4
"asc",
#define S_NOHIRES 5
"nohires",
#define S_NOHIRES2 6
"nohires!",
#define S_SCRW 7
"scrw",
#define S_SCRH 8
"scrh",
#define S_SLICED 9
"sliced",
#define S_DYN 10
"dyn",
#define S_LACE 11
"lace",
#define S_NOLACE 12
"nolace",
#define S_HIRES 13
"hires",
#define S_LORES 14
"lores",
#define S_HAM 15
"ham",
#define S_EHB 16
"ehb",
#define S_X 17
"x",
#define S_Y 18
"y",
#define S_CLIP 19
"clip",
#define S_XAVERAGE 20
"xaverage",
#define S_XMIRROR 21
"xmirror",
#define S_YMIRROR 22
"ymirror",
#define S_TRANSPOSE 23
"transpose",
#define S_COUNTMETH 24
"cmeth",
#define S_DISTRMETH 25
"dmeth",
#define S_DISTRMETH2 26
"dmeth2",
#define S_THRESHOLD 27
"threshold",
#define S_ZAP 28
"zap",
#define S_GIFMAPTRUNC 29
"gifmaptrunc",
#define S_PPM 30
"ppm",
#define S_ENLARGE 31
"enlarge",
#define S_TESTPAT 32
"testpat",
#define S_MP 33
"mp",
#define S_UNKNOWN 34
NULL
};
stringcode(char *s)
{
char **p;
if (!s || *s!='-' || s[1]=='\0')
return S_UNKNOWN;
++s;
for (p=sc; *p; ++p)
if (!strcmp(s, *p))
break;
return p-sc;
}
void
do_options(int argc, char **argv)
{
int i, j;
if (argc<2)
usage();
for (i=1; i<argc && argv[i][0]=='-' && argv[i][1]!='\0'; ++i) {
lowcase(argv[i]);
switch (stringcode(argv[i])) {
case S_IFF: outputformat=IFF; break;
case S_SRGR: outputformat=SRGR; break;
case S_RGB: directrgb=atol(argv[++i]); break;
case S_NOCOMPR: compression=COMPR_NONE; break;
case S_ASC: asc=1; break;
case S_NOHIRES: hires=HIRES_MAYBE; break;
case S_NOHIRES2: hires=HIRES_NOT; break;
case S_SCRW: scrw=atol(argv[++i]); break;
case S_SCRH: scrh=atol(argv[++i]); break;
case S_SLICED: sliced=SLICED_SHAM; break;
case S_DYN: sliced=SLICED_DYN; break;
case S_MP: sliced=SLICED_PCHG; break;
case S_LACE: ymode=LACE; break;
case S_NOLACE: ymode=NOLACE; break;
case S_HIRES: xmode=HIRES; break;
case S_LORES: xmode=LORES; break;
case S_HAM: xmode=HAM; break;
case S_EHB: xmode=EHB; break;
case S_X:
xa=atol(argv[++i]);
xb=atol(strchr(argv[i], '/')+1);
break;
case S_Y:
yc=atol(argv[++i]);
yd=atol(strchr(argv[i], '/')+1);
break;
case S_TESTPAT:
testpatx=atoi(argv[++i]);
testpaty=atoi(argv[++i]);
break;
/* the operations are handled below, in do_operations */
case S_XAVERAGE:
case S_XMIRROR:
case S_YMIRROR:
case S_TRANSPOSE:
break;
case S_CLIP:
for (j=0; j<4; ++j) {
++i;
if (i>=argc || *argv[i]<'0' || *argv[i]>'9')
usage();
}
break;
case S_ENLARGE:
for (j=0; j<2; ++j) {
++i;
if (i>=argc || *argv[i]<'0' || *argv[i]>'9')
usage();
}
break;
case S_COUNTMETH:
if ((j=cmethnum(argv[++i]))== -1)
usage();
countmeth=j;
break;
case S_DISTRMETH:
if ((j=dmethnum(argv[++i]))== -1)
usage();
distrmeth=j;
break;
case S_THRESHOLD: threshold=atol(argv[++i]); break;
case S_DISTRMETH2:
xmode=HAM;
if ((j=dmethnum(argv[++i]))== -1)
usage();
distrmeth2=j;
break;
case S_ZAP: zap_option=1; break;
case S_GIFMAPTRUNC: gifmaptrunc=1; break;
case S_PPM: outputformat=PPM; break;
case S_UNKNOWN:
usage();
break;
default:
assert(0);
break;
}
}
if (argc<=i || argc>i+2)
usage();
infilename=argv[i];
if (argc>i+1)
outfilename=argv[i+1];
else
outfilename=NULL;
if (outfilename==NULL && testpatx) {
outfilename=infilename;
infilename=NULL;
}
}
void
do_operations(int argc, char **argv)
{
int i;
inoperation=1;
for (i=1; i<argc; ++i) {
switch (stringcode(argv[i])) {
case S_CLIP:
do_clipping(atoi(argv[i+1]), atoi(argv[i+2]), atoi(argv[i+3]),
atoi(argv[i+4]));
break;
case S_ENLARGE:
do_enlarge(atoi(argv[i+1]), atoi(argv[i+2]));
break;
case S_XAVERAGE: xaverage(); break;
case S_XMIRROR: xmirror(); break;
case S_YMIRROR: ymirror(); break;
case S_TRANSPOSE: transpose(); break;
}
}
inoperation=0;
}